package cn.tannn.ip2region.sdk;

import cn.tannn.ip2region.sdk.config.SearcherConfig;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author tan
 */
public class IpRegionUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(IpRegionUtil.class);

    /**
     * 判断是否为合法 IP
     * @return
     */
    public static boolean checkIp(String ipAddress) {
        LOGGER.debug(" ===>  checkIp ipAddress {}", ipAddress);
        try {
           String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
           Pattern pattern = Pattern.compile(ip);
           Matcher matcher = pattern.matcher(ipAddress);
           return matcher.matches();
       }catch (Exception e){
           LOGGER.error("错误的ipAddress : {}", ipAddress);
           return false;
       }
    }

    /**
     * 获取 ip 所属地址
     *  优先获取本地，本地获取不到使用线上开放的接口
     * @param request HttpServletRequest
     * @return
     */
    public static String getIpRegion(HttpServletRequest request) {
        return getIpRegion(IpUtil.getPoxyIpEnhance(request));
    }

    /**
     * 获取 ip 所属地址
     *  优先获取本地，本地获取不到使用线上开放的接口
     * @param ip ip
     * @return
     */
    public static String getIpRegion(String ip) {
        boolean isIp = checkIp(ip);
        if (isIp) {
            try {
                // searchIpInfo 的数据格式： 国家|区域|省份|城市|ISP
                String searchIpInfo = SearcherConfig.searcher.search(ip);
                LOGGER.debug(" =======> SearcherConfig searchIpInfo {}", searchIpInfo);
                return searchIpInfo.replace("|","-");
            } catch (Exception e) {
                LOGGER.warn("所属地址解析失败 - 使用whois.pconline.com.cn进行解析 ", e);
                return IpUtil.getIpRegionOnline(ip);
            }
        } else {
            LOGGER.error("非法的IP地址");
        }
        return "-";
    }


    /**
     * 获取 ip 所属地址
     *
     * @param searchIpInfo ip
     * @return
     */
    public static String analysisSearchIpInfo(String searchIpInfo) {

        String[] splitIpInfo = searchIpInfo.split("\\|");
        if (splitIpInfo.length > 0) {
            if ("中国".equals(splitIpInfo[0])) {
                // 国内属地返回省份
                return splitIpInfo[2];
            } else if ("0".equals(splitIpInfo[0])) {
                if ("内网IP".equals(splitIpInfo[4])) {
                    // 内网 IP
                    return splitIpInfo[4];
                }
            } else {
                // 国外属地返回国家
                return splitIpInfo[0];
            }
        }
        return "-";
    }

}
